/**
 * Created by Administrator on 2016/11/26.
 */
// 定义一个Cookie的类
function Cookie(){
    //如果当前类没有实例化，则返回这个Cookie的实例
    if(!(this instanceof Cookie)) return new Cookie();
}
// 在类的原型上添加常用操作cookie的方法
Cookie.prototype = {
    //调用cookie.get('test1')
    get: function(name){
        //nameEQ值为test1=
        var nameEQ = name + "=";
        //document.cookie => "test1=121; test2=3231; test3=322"
        //把cookie分割成组 ["test1=121", " test2=3231", " test3=322"], 注意第二个和第三个前面是有空字符的
        var ca = document.cookie.split(';');

        for(var i=0;i < ca.length;i++) {
            var c = ca[i];//取得字符串
            //判断一下字符串有没有前导空格
            //这里就是将元素中前面有空字符的去掉
            while (c.charAt(0)==' ') {
                c = c.substring(1,c.length);//有的话，从第二位开始取
            }
            //如果含有我们要的name
            //判断元素中是否有包含`test1=`，
            //如果有的话，判断是否是在字符串的最前面，如果是就使用substring将值截取出来，并调用window.unescape对字符串进行解码，并返回
            if (c.indexOf(nameEQ) == 0) {
                return unescape(c.substring(nameEQ.length,c.length));//解码并截取我们要值
            }
        }
        return false;
    }, //获取cookie
    // set('test4', 12312, 7) or set({ name1:1, name2:2 })
    set: function(name, value, options){
        //如果第一个参数是obj, 这里处理第二种情况，批量设置cookie
        if (isPlainObject(name)) {
            for (var k in name) {
                if (name.hasOwnProperty(k)) this.set(k, name[k], value);
            }
        }else{
            //如果第三个参数是obj, 则表示是一个自定义的配置
            var opt = isPlainObject(options) ? options : { expires: options },
                expires = opt.expires !== undefined ? opt.expires : '',
                expiresType = typeof(expires),
            //默认当前域的是根目录下
                path = opt.path !== undefined ? ';path=' + opt.path : ';path=/',
                domain = opt.domain ? ';domain=' + opt.domain : '',
                secure = opt.secure ? ';secure' : '';
            //过期时间
            if (expiresType === 'string' && expires !== '') expires = new Date(expires);
            //如果num是数值，那么以天的时间为单位
            else if (expiresType === 'number') expires = new Date(+new Date + 1000 * 60 * 60 * 24 * expires);
            //最后将时间转成GMT的字符串格式
            if (expires !== '' && 'toGMTString' in expires) expires = ';expires=' + expires.toGMTString();
            //转码后存储到document.cookie
            document.cookie = name+"="+escape(value)+expires+path+domain+secure;   //转码并赋值
        }
    },//设置cookie
    remove: function(names){
        names = isArray(names) ? names : toArray(arguments);
        for (var i = 0, l = names.length; i < l; i++) {
            //调用了cookie.set，设置过期时间是-1天，让cookie失效
            this.set(names[i], '', -1);
        }
        return names;
    }, //删除cookie
    //主要用来清除所有cookie，调用时使用 cookie.clear()
    //同时也兼容清除单个cookie如：cookie.clear('test1')
    clear: function(name){
        return name?this.remove(name):this.remove(getKeys(this.all()));
    }, //清除cookie 调用remove方法，清除一个或多个cookie
    all:function () {
        if (document.cookie === '') return {};
        //将cookie分隔成数组
        var cookies = document.cookie.split('; '),result = {};
        for (var i = 0, l = cookies.length; i < l; i++) {
            var item = cookies[i].split('=');
            //将键和值解码后返回
            result[unescape(item[0])] = unescape(item[1]);
        }
        //返回结果
        return result;
    }//返回所有cookie
}

// 提供 cookie('key', 'value', {..}) 的调用方式
var cookie = function(name, value, options){
    var args = arguments, cookieIns = Cookie();
    // cookie()
    if(args.length === 0) return cookieIns.all();
    // cookie(null)
    if(args.length === 1 && name === null) return cookieIns.clear();
    // cookie('token', null)/cookie('token', '')
    if(args.length === 2 && !value) return cookieIns.clear(name);
    // cookie('token')
    if(typeof(name) === 'string' && !value) return cookieIns.get(name);
    // cookie('token','1232321423', 1)/cookie({'test1':'01', test2:'02'},{'expires':7})
    if(isPlainObject(name) || (args.length>1 && name && value))
        return cookieIns.set(name, value, options);
    // cookie(['test1', 'test2'], null)
    if(value===null) return cookieIns.remove(name);
    return cookieIns.all();
}
// 提供 cookie.set(),cookie.get()等调用方式(代码复用)
for(var a in Cookie.prototype) cookie[a] = Cookie.prototype[a];
